[Redshift] psqlのタイムアウトを回避する
こんにちは、DI部の川崎です。
RedshiftのクライアントとしてMac上のpsqlを使用していますが、処理に長時間かかるクエリの場合、タイムアウトが発生してしまい、クエリの結果がきちんと取得できない、という問題が発生していました。
社内で質問をしたところ、下記のページのkeepaliveの設定を教えてもらいましたので、試してみます。(本エントリではMacの場合を試しています)
Amazon EC2 以外から接続する — ファイアウォールタイムアウトの問題 http://docs.aws.amazon.com/ja_jp/redshift/latest/mgmt/connecting-firewall-guidance.html
sudo sysctl net.inet.tcp.keepintvl=20000 sudo sysctl net.inet.tcp.keepidle=20000 sudo sysctl net.inet.tcp.keepinit=20000 sudo sysctl net.inet.tcp.always_keepalive=1
長時間かかるクエリの代わりに、前回のエントリでご紹介したSleepを使用します。タイムアウトは60分で起きているようですので、余裕をみて3700秒スリープすることにします。
【小ネタ】RedshiftでSleepする方法 https://dev.classmethod.jp/server-side/db/redshift-sleep-01/
設定前
demo=# select f_sleep(3700); -- 1時間(正確には3700秒)以上待っても、結果は返ってきません。 -- セッションは失われてしまいました。
設定後
demo=# \timing Timing is on. -- 前回同様タイミングコマンドで、処理時間を表示するようにします。 demo=# select f_sleep(3700); f_sleep ------------ t (1 row) Time: 3700226.472 ms
keepaliveの設定が有効になり、無事に結果が返ってきました!
設定を保持するには
先ほどのページに掲載されている、設定を保存する方法をご紹介しておきます。
設定を保持するには、次の値を使ってファイル /etc/sysctl.conf を作成または変更します。
net.inet.tcp.keepidle=20000 net.inet.tcp.keepintvl=20000 net.inet.tcp.keepinit=20000 net.inet.tcp.always_keepalive=1
コンピュータを再起動し、次のコマンドを実行して、値が設定されていることを確認します。
sysctl net.inet.tcp.keepidle sysctl net.inet.tcp.keepintvl sysctl net.inet.tcp.keepinit sysctl net.inet.tcp.always_keepalive
最後に
社内では、この方法を試してもうまくいかず、別の設定をしたという声も聞かれました。もし別の方法、追加で必要な設定をご存知の方がいらっしゃいましたら、コメント欄からお知らせください。